package com.icss.flow.controller;

import com.icss.flow.pojo.dto.DelegateTaskDTO;
import com.icss.flow.pojo.dto.FlowDTO;
import com.icss.flow.service.FlowService;
import jakarta.validation.constraints.NotBlank;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * @author hyk
 * {@code @Date} 2024/3/13
 */
@RestController
@RequestMapping("/flow")
@Slf4j
public class FlowController {


    @Autowired
    private FlowService flowService;


    /**
     * 部署实体对应的流程
     * @param flowDTO 流程
     * @return
     */
    @PostMapping("deployEntity")
    R<?> deployEntity(@Validated @RequestBody FlowDTO flowDTO) {
        return R.ok(flowService.deployEntity(flowDTO));
    }

    @PostMapping("deploy")
    R<?> deploy(@Validated @RequestBody FlowDTO flowDTO) {
        return R.ok(flowService.deployFlow(flowDTO));
    }




    /**
     * 获取流程的bpmn文件
     * @param flowKey
     * @return
     */

    @GetMapping("getBpmn/{flowKey}")
    R<?> getBpmn(@PathVariable String flowKey) {
        return R.ok(flowService.getBpmn(flowKey));
    }

    /**
     * 获取实体对应的流程的bpmn文件
     * @param entityCode 流程key
     * @return
     */

    @GetMapping("getEntityBpmn/{entityCode}")
    R<?> getEntityBpmn(@PathVariable Integer entityCode) {
        return R.ok(flowService.getEntityBpmn(entityCode));
    }


    /**
     * 查询所有的流程
     * @return 流程列表
     */
    @GetMapping("list")
    TableDataInfo<?> queryFlowList(PageQuery pageQuery) {
        return flowService.queryFlowList(pageQuery);

    }

    /**
     * 发起流程
     *
     * @param entityCode 流程key
     * @param id 流程key
     * @param params 发起表单的相关数据
     * @return
     */
    @PostMapping("startFlow/{entityCode}")
    R<?> startFlow(@Validated @PathVariable @NotBlank Integer entityCode,Integer id, @RequestBody @NotBlank Map<String, Object> params) {
        return R.ok(flowService.launchFlow(entityCode,id, params));
    }

    /**
     * 根据任务id查询任务详情
     */
    @GetMapping()
    R<?> getFlowList() {
        return R.ok(flowService.selectFlowByFlowId());
    }
    // 领取任务
    // 返还任务
    // 待办任务
    // 委托任务taskService.delegateTask();
    @PostMapping("delegateTask")
    R<?> delegateTask(@RequestBody DelegateTaskDTO delegateTaskDTO) {
        return R.ok(flowService.delegateTask(delegateTaskDTO));
    }

    /**
     * 查询待办事项
     *
     * @param pageQuery
     * @return
     */

    @GetMapping("todoList")
    TableDataInfo<?> queryToDoTaskList(PageQuery pageQuery) {
        return flowService.queryToDoTaskList(pageQuery);
    }

    /**
     * 查询历史待办事件
     *
     * @param pageQuery
     * @return
     */

    @GetMapping("historyTodoList")
    TableDataInfo<?> queryHistoryTodoList(PageQuery pageQuery) {
        return flowService.queryHistoryToDoTaskList(pageQuery);
    }

    // 任务转交

    @PostMapping("taskTransfer")
    R<?> taskTransfer(){
        return R.ok(flowService.taskTransfer());
    }
    // 处理流程
    // 历史流程查询

    @GetMapping("historyFlow")
    R<?> queryHistoryByFlowId(String taskId) {
        return R.ok(flowService.queryHistoryByTaskId(taskId));
    }


    /**
     * 任务通过
     * @param taskId 任务id
     *
     * @return
     */
    @PostMapping("completeTask/{taskId}")
    R<?> completeTask(@PathVariable String taskId,@RequestBody Map<String, Object> params) {
        return R.ok(flowService.completeTask(taskId, params));
    }



}
